home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / inet / RCS / inet_addr.c,v < prev    next >
Text File  |  1988-07-25  |  3KB  |  151 lines

  1. head     1.2;
  2. access   ;
  3. symbols  ;
  4. locks    ; strict;
  5. comment  @ * @;
  6.  
  7.  
  8. 1.2
  9. date     88.07.25.13.41.47;  author ouster;  state Exp;
  10. branches ;
  11. next     1.1;
  12.  
  13. 1.1
  14. date     88.06.20.09.44.30;  author ouster;  state Exp;
  15. branches ;
  16. next     ;
  17.  
  18.  
  19. desc
  20. @@
  21.  
  22.  
  23. 1.2
  24. log
  25. @Lint.
  26. @
  27. text
  28. @/*
  29.  * Copyright (c) 1983 Regents of the University of California.
  30.  * All rights reserved.
  31.  *
  32.  * Redistribution and use in source and binary forms are permitted
  33.  * provided that this notice is preserved and that due credit is given
  34.  * to the University of California at Berkeley. The name of the University
  35.  * may not be used to endorse or promote products derived from this
  36.  * software without specific prior written permission. This software
  37.  * is provided ``as is'' without express or implied warranty.
  38.  */
  39.  
  40. #if defined(LIBC_SCCS) && !defined(lint)
  41. static char sccsid[] = "@@(#)inet_addr.c    5.5 (Berkeley) 3/7/88";
  42. #endif /* LIBC_SCCS and not lint */
  43.  
  44. #include <sys/types.h>
  45. #include <ctype.h>
  46. #include <netinet/in.h>
  47.  
  48. /*
  49.  * Internet address interpretation routine.
  50.  * All the network library routines call this
  51.  * routine to interpret entries in the data bases
  52.  * which are expected to be an address.
  53.  * The value returned is in network order.
  54.  */
  55. u_long
  56. inet_addr(cp)
  57.     register char *cp;
  58. {
  59.     register u_long val, base;
  60.     int n;
  61.     register char c;
  62.     u_long parts[4], *pp = parts;
  63.  
  64. again:
  65.     /*
  66.      * Collect number up to ``.''.
  67.      * Values are specified as for C:
  68.      * 0x=hex, 0=octal, other=decimal.
  69.      */
  70.     val = 0; base = 10;
  71.     if (*cp == '0') {
  72.         if (*++cp == 'x' || *cp == 'X')
  73.             base = 16, cp++;
  74.         else
  75.             base = 8;
  76.     }
  77.     while (c = *cp) {
  78.         if (isdigit(c)) {
  79.             val = (val * base) + (c - '0');
  80.             cp++;
  81.             continue;
  82.         }
  83.         if (base == 16 && isxdigit(c)) {
  84.             val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
  85.             cp++;
  86.             continue;
  87.         }
  88.         break;
  89.     }
  90.     if (*cp == '.') {
  91.         /*
  92.          * Internet format:
  93.          *    a.b.c.d
  94.          *    a.b.c    (with c treated as 16-bits)
  95.          *    a.b    (with b treated as 24 bits)
  96.          */
  97.         if (pp >= parts + 4)
  98.             return (INADDR_NONE);
  99.         *pp++ = val, cp++;
  100.         goto again;
  101.     }
  102.     /*
  103.      * Check for trailing characters.
  104.      */
  105.     if (*cp && !isspace(*cp))
  106.         return (INADDR_NONE);
  107.     *pp++ = val;
  108.     /*
  109.      * Concoct the address according to
  110.      * the number of parts specified.
  111.      */
  112.     n = pp - parts;
  113.     switch (n) {
  114.  
  115.     case 1:                /* a -- 32 bits */
  116.         val = parts[0];
  117.         break;
  118.  
  119.     case 2:                /* a.b -- 8.24 bits */
  120.         val = (parts[0] << 24) | (parts[1] & 0xffffff);
  121.         break;
  122.  
  123.     case 3:                /* a.b.c -- 8.8.16 bits */
  124.         val = (parts[0] << 24) | ((parts[1] & 0xff) << 16) |
  125.             (parts[2] & 0xffff);
  126.         break;
  127.  
  128.     case 4:                /* a.b.c.d -- 8.8.8.8 bits */
  129.         val = (parts[0] << 24) | ((parts[1] & 0xff) << 16) |
  130.               ((parts[2] & 0xff) << 8) | (parts[3] & 0xff);
  131.         break;
  132.  
  133.     default:
  134.         return (INADDR_NONE);
  135.     }
  136.     val = htonl(val);
  137.     return (val);
  138. }
  139. @
  140.  
  141.  
  142. 1.1
  143. log
  144. @Initial revision
  145. @
  146. text
  147. @d32 2
  148. a33 1
  149.     register u_long val, base, n;
  150. @
  151.